/*
 * Copyright 2008-2009 Aying.Net with Fuchun.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.aying.util;

import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;

/**
 * 包含文件处理的常用方法的工具类。
 * 
 * @author Fuchun
 * @version 1.0, 2009-6-13
 */
public class FileUtils extends Utils {

    /**
     * 获取给定文件目录路径下的文件总数。
     * <ul>
     * <li>若给定的 <tt>directoryPath</tt> 文件目录路径为 <code>NULL</code>
     * 或空字符串，则返回0。</li>
     * <li>若给定的 <tt>directoryPath</tt> 文件目录路径不存在，或不是一个文件夹，返回0。</li>
     * </ul>
     * 
     * @param directoryPath 给定的文件目录。
     * @return 给定的文件目录下的文件总数。
     * @see #getFileCount(File)
     */
    public static int getFileCount(String directoryPath) {
        if (StringUtils.isNullOrEmpty(directoryPath)) return 0;
        return getFileCount(new File(directoryPath));
    }

    /**
     * 获取给定文件目录下的文件总数。
     * <p>
     * 若给定的 <tt>directory</tt> 文件目录为 <code>NULL</code>、标准文件或者不存在，则始终返回 0。
     * </p>
     * 
     * @param directory 给定的 <code>java.io.File</code> 文件目录。
     * @return 给定的文件目录下的文件总数。
     */
    public static int getFileCount(File directory) {
        if (directory == null || !directory.exists() || directory.isFile()) return 0;
        int count = 0;
        if (directory.isDirectory()) {
            File[] files = directory.listFiles();
            for (File f : files) {
                if (f.isDirectory()) count += getFileCount(f);
                if (f.isFile()) count += 1;
            }
        }
        return count;
    }
    
    /**
     * 获取给定文件目录路径下的文件目录总数。
     * <ul>
     * <li>若给定的 <tt>directoryPath</tt> 文件目录路径为 <code>NULL</code>
     * 或空字符串，则返回0。</li>
     * <li>若给定的 <tt>directoryPath</tt> 文件目录路径不存在，或不是一个文件夹，返回0。</li>
     * </ul>
     * 
     * @param directoryPath 给定的文件目录。
     * @return 给定文件目录路径下的文件目录总数。
     * @see #getDirectoryCount(File)
     */
    public static int getDirectoryCount(String directoryPath) {
        if(StringUtils.isNullOrEmpty(directoryPath))
            return 0;
        return getDirectoryCount(new File(directoryPath));
    }
    
    /**
     * 获取给定文件目录下的文件目录总数。
     * <p>
     * 若给定的 <tt>directory</tt> 文件目录为 <code>NULL</code>、标准文件或者不存在，则始终返回 0。
     * </p>
     * 
     * @param directory 给定的 <code>java.io.File</code> 文件目录。
     * @return 给定文件目录下的文件目录总数。
     */
    public static int getDirectoryCount(File directory) {
        if(directory == null || !directory.exists() || directory.isFile())
            return 0;
        int count = 0;
        if(directory.isDirectory()) {
            File[] files = directory.listFiles();
            for(File f : files) {
                if(f.isDirectory()) {
                    count += 1;
                    count += getDirectoryCount(f);
                }
            }
        }
        return count;
    }

    /**
     * 将给定文件路径的文件移动到给定的路径下。
     * <p>
     * 若 <code>newFilePath</code> 表示一个文件，则移动后重命名并保存。否则移动
     * <code>newFilePath</code> 表示一个文件夹下。 若 <code>filePath</code> 和
     * <code>newFilePath</code> 相同，则直接返回给定文件路径(<code>filePath</code>)表示的
     * <code>java.io.File</code> 对象。
     * </p>
     * 
     * @param filePath 要移动的文件路径。
     * @param newFilePath 目标文件夹或者目标文件路径。
     * @param isCover 若新的目标文件已存在是否进行覆盖操作。
     * @return 给定文件径路的文件的包含新路径的 <code>java.io.File</code> 对象。
     * @throws FileNotFoundException 若要移动的文件不存在，则抛出此异常。
     * @throws IOException 移动过程中被中断，或者要移动的文件正在被另一线程以写方式占用，则抛出此异常。
     */
    public static File move(String filePath, String newFilePath, boolean isCover)
            throws FileNotFoundException, IOException {
        File file = new File(filePath);
        if (!file.exists()) throw new FileNotFoundException();
        if (!file.canRead()) throw new IOException();
        File newFile = new File(newFilePath);

        return null;
    }

    public static void main(String[] args) throws Exception {
        File newFile = new File("/English");
        System.out.println(getFileCount(newFile.getAbsolutePath()));
    }
}
